home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 001-100 / 001-025 / 009 / setlace / setlace.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  6KB  |  172 lines

  1. /*    Downloaded from the "Well" by Fred Fish */
  2.  
  3. /*
  4. The following program may be used to experiment with the appearance of
  5. your Amiga text and graphics when interlace is turned on.  For non-
  6. interlaced "screens", the effect will be to line-double each raster
  7. line.  The visual result is that the black "gaps" between raster lines
  8. are dramatically reduced (the pixels appear to have become somewhat
  9. taller).  For text, this yields a "fuller" character that many people
  10. find more pleasing.
  11.  
  12. Because interlace is turned on, many people will notice "flicker" in
  13. the image.  The physiology of flicker perception is pretty well
  14. understood.  The eye's ability to see flicker increases as the overall
  15. luminence (display plus room light) goes up and as the contrast between
  16. adjacent horizontal lines goes up.  Flicker can be dramatically reduced
  17. -- even to the point that you may not see it at all -- by adjusting
  18. the color, contrast, and brightness of your display.
  19.  
  20. Many folks have turned up the contrast and brightness controls of their
  21. display to get a more striking effect with the Amiga graphics.  I
  22. would suggest you start out your experiment by resetting those controls
  23. to their center position.  I have found that I get a pleasing image by
  24. adjusting the Workbench colors in Preferences such that the "white"
  25. color is a light grey (4-6 clicks in each of R, G, and B to the left
  26. of the indicator triangle) and the "blue" color is somewhat darker
  27. than default (2 clicks to the left of G and B).  I also adjust the
  28. "orange" for balance.
  29.  
  30. As with any display, you may find it better to use incandescent room
  31. lighting.  Flourescent lights also flicker and can "beat" with the
  32. display giving your eyes a real workout.
  33.  
  34. If you like the results, I'd suggest you stick a SetLace command in
  35. your startup script (s/startup-sequence) just prior to the LoadWB
  36. command.
  37.  
  38. -------------------- Program Notes:
  39.  
  40. The program will compile cleanly using the standard V1.0 Lattice C
  41. release stuff.  The Make script in the C exmples directory will do
  42. all the work.
  43.  
  44. The rather large list of include files is necessary to keep Lattice
  45. C from warning about undefined structures.  The warnings refer to
  46. structures referenced as the target of pointers in OTHER structure
  47. definitions.  We're working on getting the C to be not quite so
  48. picky, so that you can limit your includes to those definitions you
  49. actually use in expressions.  These warnings can be safely ignored,
  50. but they don't look clean.
  51.  
  52. The program is designed to be run from the CLI only.  The command
  53.   SetLace
  54. will turn on the forced interlace mode.  The command
  55.   SetLace off
  56. will turn it off again.
  57.  
  58. Note that forcing interlace does not change either the amount of
  59. memory or bus bandwidth used by text or graphics programs.  The
  60. same bitmap is just repeated one half raster line down by the hardware
  61. in the odd frame.
  62.  
  63. ---------------------  Program Source Follows:       */
  64.  
  65. /************************************************************************
  66.  *  SetLace -- Program to force the Amiga into interlaced display
  67.  *             regardless of the interlace status of the currently
  68.  *             active Screens (ViewPorts).  Run from the CLI (only).
  69.  *
  70.  *             1>SetLace        -- Set forced Interlace mode
  71.  *             1>SetLace off    -- Clear forced Interlace mode
  72.  *
  73.  *   Bob Pariseau -- November 2, 1985
  74.  *
  75.  ************************************************************************/
  76.  
  77. #include <exec/types.h>
  78. #include <exec/tasks.h>
  79. #include <exec/libraries.h>
  80. #include <graphics/copper.h>
  81. #include <graphics/display.h>
  82. #include <graphics/gfxbase.h>
  83. #include <graphics/text.h>
  84. #include <graphics/view.h>
  85. #include <hardware/blit.h>
  86. #include <intuition/intuitionbase.h>
  87.  
  88. struct GfxBase *GfxBase;
  89. struct IntuitionBase *IntuitionBase;
  90.  
  91. main(argc, argv)
  92.   int argc;
  93.   char  *argv[];
  94. {
  95.   BOOL TurnItOn;
  96.  
  97.   TurnItOn = TRUE;
  98.   if (argc > 1)
  99.     if (!strcmp(argv[1], "off")) TurnItOn = FALSE;
  100.  
  101.   GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0);
  102.   if (GfxBase == NULL) exit(1000);
  103.  
  104.   IntuitionBase = (struct IntuitionBase*)
  105.                   OpenLibrary("intuition.library", 0);
  106.   if (IntuitionBase == NULL)
  107.   {
  108.     CloseLibrary(GfxBase);
  109.     exit(2000);
  110.   }
  111.  
  112. /*  The system_bplcon0 value is ORed into all copper instructions that
  113.  *  change bplcon0 (one of the hardware bitplane control registers)
  114.  *  whenever copper lists are formed by the graphics library copper
  115.  *  list management routines.  This value provides a control context
  116.  *  for system display that overrides the normal control values usually
  117.  *  managed by Intuition.  In particular, Intuition manages the interlace
  118.  *  control in the View structure, so we have to do our control here
  119.  *  to give it some permanence.
  120.  */
  121.  
  122.   if (TurnItOn)
  123.     GfxBase->system_bplcon0 |=  INTERLACE;
  124.   else
  125.     GfxBase->system_bplcon0 &= !INTERLACE;
  126.  
  127. /*  Now we have to get all the copper lists rebuilt.  The easiest way
  128.  *  to do this is to have Intuition do it for us.  The correct way to
  129.  *  do THAT is to call RemakeDisplay() which is (sigh) broken in V1.0.
  130.  *  Therefore, we get by with the following hack.
  131.  */
  132.  
  133.   myRemakeDisplay(IntuitionBase);    /*??? RemakeDisplay();*/
  134.  
  135. /*  Be good, and clean up. */
  136.  
  137.   CloseLibrary(GfxBase);
  138.   CloseLibrary(IntuitionBase);
  139. }
  140.  
  141.  
  142.  
  143. myRemakeDisplay(IntuitionBase)
  144.   struct                            /* Cheat and use private knowledge */
  145.   {                                 /* of the initial portion of the   */
  146.     struct Library LibNode;         /* Intuition Base structure.       */
  147.     struct View ViewLord;
  148.   } *IntuitionBase;
  149. {
  150.   struct View *View;
  151.   struct ViewPort *ViewPort;
  152.  
  153.   Forbid();                         /* The V1.0 Intuition internal     */
  154.                                     /* locking protocol uses Forbid()  */
  155.                                     /* and Permit().  Under V1.1, this */
  156.                                     /* code could be unreliable if     */
  157.                                     /* another task was simultaneously */
  158.                                     /* manipulating the View.          */
  159.  
  160.   View = &IntuitionBase->ViewLord;
  161.  
  162.   ViewPort = View->ViewPort;
  163.   while (ViewPort)
  164.   {
  165.     MakeVPort(View, ViewPort);
  166.     ViewPort = ViewPort->Next;
  167.   }
  168.  
  169.   Permit();
  170.   RethinkDisplay();
  171. }
  172.